#ifndef UTILS_H
#define UTILS_H

#include <QString>
#include <QByteArrayList>
#include <math.h>

#define WIN 0

class Utils
{
public:
    Utils();

    // 将一个4字节的整数转换成16进制字符，保证占用4个字节
    static QByteArray unsignedToHexStr(unsigned short uiStr);
    static QByteArray unsignedToHexStr(unsigned u);

    static QByteArray unsignedToBinStr(unsigned u);
    static QByteArray binStrToHexStr(QByteArray& binStr);

    static QByteArray hexBytesToBin(QByteArray& hexBytes);  // 16进制字符数组转换为 2进制形式

    // 6-》06 ， 20-》14 两位字符表示的16进制， 16进制数字 转 16进制字符
    static QByteArray intToHexByte(int u );

    static QByteArray decIntToBytes(int u);

    static QString hexNumToDecNum(QString str);

    static QString hexStrToChineseStr(const QString &hexStr);

    static QString ChineseStrToHexStr(const QString &hexStr);

    static QString number(const int, int base = 16);

    static QString gbk2Utf8(const QString gbkStr);

    static QString GBKToUTF8(const QString &gbkStr);    // windos上可以将16进制字符表示的汉字转换为汉字

    static void washPacket(QString& packet);     // 删除多余的空格和逗号

    static void hexStrToChinese(QString &hexStr);

    //unicode str to Chinese str
    static void hexStrToChinese1(QString &hexStr);

    // gbk -> Chinese
    static void hexStrToChinese2(QString &hexStr);

   // 将短实数16进制字符串转换为10进制短实数， Qt 采用高字节在前，大端模式存储
    static float  hexStrToFloat(QString &hexStr);
    static float hexStrToFloat(QByteArray &hexStr);

    static double hexStrToFloat1(QString list);

    // 将16进制字符串转换为10进制字符串
    static QString hexStrToIntStr(QString &hexStr);
    static QString hexStrToIntStr(QByteArray &hexStr);

    // 将一个界面显示的浮点数转换为 16进制字符串
    static QString FloatToHexStr(float value);
    static QString floatStrToHexStr(QString fStr);

    // 把无符号整数转换为 16进制字符  “20” -> "14", 同时固定格式由数据宽度决定
    static QString uintStrToHexStr(QString uiStr, int dataWidth);

    // 256 -》 0010
    static QString intToHexStr(int intput, int dataWidth);

    static QString hexToAscii(const QString &hexStr);
    static QString hexToAscii(const QByteArray &hexByte);

    // 将单个字符的列表整理成 单次, "NoneNone" -> None , None
    static QStringList mixCharToWord(QString mixStr, int singleWidth);
    static QStringList mixCharToWord(QByteArray mixStr, int singleWidth);


    static bool isPureNumStr(QString inputStr);

    // 将字符串反转 3F 80 00 00 -> 00 00 80 3F
    static QString reverseStr(const QString &str);
    static QByteArray reverseByteArr(const QByteArray &byteArr);

    //  从报文GDD 的 data value 整体中是解析定值的最大值最小值步长,只对于整数值类型
    static QStringList parseIntTypeMinMaxStep(const QString &str, int width);   // 全部data包含最大最小步长的16进制字符， 整形数单个宽度
    static QStringList parseIntTypeMinMaxStep(const QByteArray &str, int width);   // 全部data包含最大最小步长的16进制字符， 整形数单个宽度
    // 解析多个无符号整数的字符串，
    static QStringList parseUIntType(const QString &str, int singleWidth);

    static QStringList parseFloatTypeMinMaxStep(const QString &str);
    static QStringList parseFloatDimension(QByteArray &bytes);

    /*
     * Des:一个字母占一个字节，一般单位由一个或者两个字母 A ，mA， v，kv 等
     * Para: 1.包含n个ascii的字符串、 表示单个字符宽度
     * return:
     * */
    static QString parseASCII8Bit(const QString &str, int wordWidth);

    static QString parseASCII8BTypeMinMaxStepUnit(const QString &str);
    static QString parseASCII8BTypeMinMaxStepUnit(const QByteArray &byte);

    // 时间延迟函数
    static void sleep(int mseconds);

    // 计算 asdu 数据集个数
    static int calNgdNo(QString &ngdStr);

    static int calNgdNo(QByteArray &ngdByte);

    static QString removeZero(QString &zeroStr);    // 删除 "03" 类似的 0;
    static QByteArray removeZero(QByteArray &zeroBytes);


    // 进制转换
    // 1. 16进制字符转10进制字符
    static int trans16CharTo10char(uchar &char16);

    // 将2进制的QByteArray 转换成 int 16进制数值
    static int binBytesToDecInt(QByteArray &binBytes);

    // ip 地址检查
    static bool checkIpFormat(QString &ip);

    static void washPacket(QByteArray &packet);
};

#endif // UTILS_H
